package com.zxcl.filter;

import lombok.extern.log4j.Log4j2;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * 记录请求日志的filter
 *  * 日志分为很多种
 *  * 1.请求入口日志 （ip  /api  time  ）  --- gateway/nginx
 *  * 2.接口详情日志 （userId /api params result spendTime ip ） -- 用户的行为操作  -- AOP
 *  * 3.业务日志 log.info   sql   -- service层面自己打印
 *  * --------------
 *  * 开发阶段 打在控制台
 *  * 生产环境 记录在文件 logback-spring.xml
 */
@Component
@Log4j2
public class QpsRecordsFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        //返回此请求连接到的远程地址(如果可用)。
        //返回主机名，如果没有主机名，则返回地址的字符串形式(它是使用文字创建的)。这样做的好处是不会尝试反向查找。
        //地址的主机名或字符串表示。
        String ip = request.getRemoteAddress().getHostString();
        //返回请求的URI(如果有，则包括查询字符串，但仅当它对于URI表示形式正确时)。
        //返回此URI的已解码路径组件。
        //
        //此方法返回的字符串与getRawPath方法返回的字符串相同，只是所有转义的八位字节序列都被解码。
        //此URI的已解码路径组件，如果路径未定义，则返回NULL
        String api = request.getURI().getPath();
        log.info("请求时间：{}，ip为：{}，api{}",new Date(),ip,api);
//        委托给链中的下一个WebFilter。
        return chain.filter(exchange);
    }

    //数字越小，优先级别越高
    @Override
    public int getOrder() {
        return -10;
    }
}
